package org.ala.everyday;

/**
 * 给你一个数组 nums ，数组中的数字 要么 出现一次，要么 出现两次。
 *
 * 请你返回数组中所有出现两次数字的按位 XOR 值，如果没有数字出现过两次，返回 0 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [1,2,1,3]
 *
 * 输出：1
 *
 * 解释：
 *
 * nums 中唯一出现过两次的数字是 1 。
 *
 * 示例 2：
 *
 * 输入：nums = [1,2,3]
 *
 * 输出：0
 *
 * 解释：
 *
 * nums 中没有数字出现两次。
 *
 * 示例 3：
 *
 * 输入：nums = [1,2,2,1]
 *
 * 输出：3
 *
 * 解释：
 *
 * 数字 1 和 2 出现过两次。1 XOR 2 == 3 。
 *
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 50
 * 1 <= nums[i] <= 50
 * nums 中每个数字要么出现过一次，要么出现过两次。
 *
 * @author ala
 * @date 2024-10-12 08:37
 */
public class Q3158 {

    public static void main(String[] args) {
        Q3158 q = new Q3158();

        int[] nums = {2,14,47,34,19,29,4,38,10,5,45,10,18,11,28,12,39,20,50,9,28,27,36,35,41,35,23,21,5,18,3,11,3,29,25,46,45,42,43,19};

        System.out.println(q.duplicateNumbersXOR(nums));
    }

    public int duplicateNumbersXOR(int[] nums) {
        long vis = 0l;
        int ans = 0;
        for (int n : nums) {
            if ((vis >> n & 1) != 0) {
                ans ^= n;
            } else {
                vis |= 1l << n;
            }
        }
        return ans;
    }
}
